home *** CD-ROM | disk | FTP | other *** search
/ The Amiga Classic Collection / The Amiga Classic Collection - Disc 1.iso / Education / ED05-AmRadio1.DMS / ED05-AmRadio1.adf / Terminal Progs / N3ETerm / P81.ASM < prev    next >
Assembly Source File  |  1988-01-19  |  21KB  |  1,195 lines

  1. * P81.ASM 092886
  2.  NOPAGE
  3.  
  4.  INCLUDE "A:SYSBASE.LVO"
  5.  
  6. _AbsExecBase equ 4
  7.  
  8. startup:            ; reference for Wack users
  9.  MOVE.L   _AbsExecBase,A6  $4,A6
  10.  SUBA.L   A1,A1
  11.  JSR      _LVOFindTask(A6)
  12.  MOVE.L   D0,A4
  13.  LEA.L    DOSName(PC),A1
  14.  MOVEQ.L  #0,D0        Lib version
  15.  JSR      _LVOOpenLibrary(A6)
  16.  MOVE.L   D0,A5
  17.  BEQ      RTS1        DOSERROR
  18.  
  19.  BSR      _main          call C main entry
  20.  
  21.  MOVEQ.L  #0,D0             return success code
  22. RTS1
  23.  RTS
  24.  
  25.  
  26. WD EQU 640
  27. HT EQU 200
  28. CAPSIZE EQU 4096
  29.  
  30. CAPTURE EQU -1 .B
  31. send    EQU -2 .B
  32. sendok  EQU -3 .B
  33. brate   EQU -4 .B
  34. newcall EQU -5 .B
  35. MON    EQU -6 .B
  36. VARi   EQU -8 .W
  37. SENCNT EQU -10 .W
  38. FHCAPT EQU -14 .L
  39. FHSEND EQU -18 .L
  40. R_R    EQU -22 .L
  41. W_R    EQU -26 .L
  42. rs_in  EQU -28 .W
  43. rs_out EQU -30 .W
  44. N_M    EQU -34 .L
  45. SENPNT EQU -38 .L
  46. xname  EQU SENPNT-32
  47. name   EQU xname-32
  48. rbuff  EQU name-512
  49. cbuff  EQU rbuff-512
  50. BUFCAP EQU cbuff-CAPSIZE
  51. BUFSEN EQU BUFCAP-512
  52.  
  53. _main
  54.  LEA       INTU_LIB(PC),A1
  55.  JSR       _LVOOpenLibrary(A6)
  56.  MOVE.L    D0,_IntuitionBase
  57.  BEQ       EXIT1
  58.  
  59.  LEA       GRAP_LIB(PC),A1
  60.  JSR       _LVOOpenLibrary(A6)
  61.  MOVE.L    D0,_GfxBase
  62.  BEQ       EXIT1
  63.  
  64.  LINK      A4,#BUFSEN
  65.  MOVEM.L   D2/D7,-(A7)
  66.  
  67.  MOVEQ     #1,D1
  68.  CLR.W     name(A4)
  69.  CLR.W     VARi(A4)
  70.  CLR.B     send(A4)
  71.  CLR.B     CAPTURE(A4)
  72.  MOVE.B    D1,MON(A4)
  73.  MOVE.B    D1,brate(A4)
  74.  MOVE.B    D1,sendok(A4)
  75.  
  76. *if(!(mywindow=(struct Window *)OpenWindow(&NewWindow)))
  77.  MOVE.L    A6,-(A7)
  78.  MOVEA.L   _IntuitionBase(PC),A6
  79.  LEA       NewWindow(PC),A0
  80.  JSR       _LVOOpenWindow(A6)
  81.  MOVEA.L   (A7)+,A6
  82.  MOVE.L    D0,mywindow
  83.  BEQ       EXIT1
  84.  
  85. *Read_Request=
  86. *(struct IOExtSer *)AllocMem(sizeof(*Read_Request),MEMF_PUBLIC|MEMF_CLEAR)
  87.  BSR       DO_Alloc
  88.  MOVE.L    D0,R_R(A4)
  89.  
  90. *Read_Request->io_SerFlags=SERF_SHARED | SERF_XDISABLED
  91.  MOVEA.L   D0,A0
  92.  MOVE.B    #$A0,$4F(A0)
  93.  
  94. *Read_Request->IOSer.io_Message.mn_ReplyPort=CreatePort("Read_RS",0)
  95.  LEA       MRead_RS(PC),A0
  96.  BSR       DoCreate
  97.  MOVEA.L   R_R(A4),A1
  98.  MOVE.L    D0,$0E(A1)
  99.  
  100. *if(OpenDevice(SERIALNAME,NULL,Read_Request,NULL))
  101.  BSR       OPEN_SERIAL
  102.  BNE       ENDALL goto endall
  103.  
  104. *Read_Request->IOSer.io_Command=CMD_READ
  105. *Read_Request->IOSer.io_Length=1
  106. *Read_Request->IOSer.io_Data=(APTR) &rs_in[0]
  107.  MOVEA.L   R_R(A4),A0
  108.  MOVE.W    #2,$1C(A0)
  109.  MOVEQ     #1,D0
  110.  MOVE.L    D0,$24(A0)
  111.  LEA       rs_in(A4),A1
  112.  MOVE.L    A1,$28(A0)
  113.  
  114. *Write_Request=(struct IOExtSer *)AllocMem(sizeof(*Write_Request),MEMF_PUBLIC|MEMF_CLEAR);
  115. *Write_Request->io_SerFlags=SERF_SHARED | SERF_XDISABLED
  116.  BSR       DO_Alloc
  117.  MOVE.L    D0,W_R(A4)
  118.  MOVEA.L   D0,A0
  119.  MOVE.B    #$A0,$4F(A0)
  120.  
  121. *Write_Request->IOSer.io_Message.mn_ReplyPort=CreatePort("Write_RS",0)
  122.  LEA       MWrite_RS(PC),A0
  123.  BSR       DoCreate
  124.  MOVEA.L   W_R(A4),A1
  125.  MOVE.L    D0,$E(A1)
  126.  
  127. *if(OpenDevice(SERIALNAME,NULL,Write_Request,NULL))
  128.  BSR       OPEN_SERIAL
  129.  BNE       ENDALL goto endall
  130.  
  131. *Write_Request->IOSer.io_Command=CMD_WRITE
  132.  MOVEA.L   W_R(A4),A0
  133.  MOVE.W    #3,$1C(A0)
  134.  
  135. *Write_Request->IOSer.io_Length=1
  136.  MOVEQ     #1,D0
  137.  MOVE.L    D0,$24(A0)
  138.  
  139. *Write_Request->IOSer.io_Data=(APTR) &rs_out[0]
  140.  LEA       rs_out(A4),A1
  141.  MOVE.L    A1,$28(A0)
  142.  
  143. *SetAPen(mywindow->RPort,1)
  144.  BSR       PENSET1
  145.  
  146. *Read_Request->io_SerFlags=SERF_SHARED | SERF_XDISABLED
  147.  MOVEA.L   R_R(A4),A0 ??
  148.  MOVE.B    #$A0,$4F(A0)  ??
  149.  
  150. *Read_Request->io_ReadLen=8
  151.  MOVEQ     #8,D0
  152.  MOVE.B    D0,$4C(A0)
  153.  
  154. *Read_Request->io_WriteLen=8
  155.  MOVE.B    D0,$4D(A0)
  156.  
  157. *Read_Request->io_CtlChar=1L
  158.  MOVEQ     #1,D0
  159.  MOVE.L    D0,$30(A0)
  160.  
  161.  MOVE.L    #1200,D0 1200 Baud to start
  162.  BSR DO_RR_BEGIN
  163.  
  164.  
  165. ***
  166. MAIN ;main loop
  167. ***
  168.  
  169. * /* wait for window/serial port message */
  170. * Wait((1<<Read_Request->IOSer.io_Message.mn_ReplyPort->
  171. * mp_SigBit) | (1<<mywindow->UserPort->mp_SigBit))
  172.  MOVEA.L   R_R(A4),A1
  173.  MOVEA.L   $E(A1),A0
  174.  MOVEQ     #0,D1
  175.  MOVE.B    $F(A0),D1
  176.  MOVEQ     #1,D0
  177.  ASL.L     D1,D0
  178.  MOVEA.L   mywindow(PC),A1
  179.  MOVEA.L   $56(A1),A0
  180.  MOVEQ     #0,D1
  181.  MOVE.B    $F(A0),D1
  182.  MOVEQ     #1,D2
  183.  ASL.L     D1,D2
  184.  OR.L      D2,D0
  185.  JSR       _LVOWait(A6)
  186.  
  187. * while(CheckIO(Read_Request))
  188. CKIO
  189.  MOVE.L    R_R(A4),A1
  190.  JSR       _LVOCheckIO(A6)
  191.  TST.L     D0
  192.  BEQ       CKKEY
  193.  
  194. * {WaitIO(Read_Request)
  195.  MOVE.L    R_R(A4),A1
  196.  JSR       _LVOWaitIO(A6)
  197.  
  198. * c=rs_in[0] & 0x7F;
  199.  MOVE.B    rs_in(A4),D7
  200.  ANDI.B    #$7F,D7
  201.  BSR       BeginIO_RR
  202.  
  203.  CMPI.B    #$A,D7
  204.  BEQ.S     CKIO
  205.  CMPI.B    #$D,D7
  206.  BNE.S     L2B8
  207.  MOVE.B    #$A,D7
  208.  
  209. L2B8
  210.  TST.B     send(A4)
  211.  BEQ.S     L2C8
  212.  CMPI.B    #$13,D7        ^S
  213.  BNE.S     L2C8
  214.  CLR.B     sendok(A4)
  215.  
  216. L2C8
  217.  CMPI.B    #$11,D7        ^Q
  218.  BNE.S     L2D4
  219.  MOVE.B    #1,sendok(A4)
  220.  
  221. * if (c==7) emit(c);
  222. L2D4
  223.  CMPI.B    #7,D7
  224.  BNE.S     L2EC
  225.  BSR       EMITD7
  226.  
  227. * if ((c>31 && c<127) || (c>=8 && c<=10))
  228. L2EC
  229.  CMPI.B    #$1F,D7
  230.  BLS.S     L2F8
  231.  CMPI.B    #$7F,D7
  232.  BCS.S     L300
  233. L2F8
  234.  CMPI.B    #8,D7     Drop ^ chars
  235.  BCS       CKIO
  236.  CMPI.B    #$A,D7
  237.  BHI       CKIO
  238.  
  239. * if (!mon) emit(c);
  240. L300
  241.  TST.B     MON(A4)
  242.  BNE.S     FILL
  243.  BSR       EMITD7
  244.  
  245. ***
  246. FILL ;rbuff with line of text
  247. ***
  248.  MOVE.W    VARi(A4),D0    i
  249.  CMPI.B    #8,D7          c=8?
  250.  BNE.S     FILL1
  251.  SUBQ.W    #1,VARi(A4)    i-
  252.  BPL       CKIO
  253.  BRA       ENDI
  254.  
  255. FILL1
  256.  CMPI.W    #512,D0        i=549?
  257.  BEQ       CKIO
  258.  LEA       rbuff(A4),A0
  259.  ADDA.W    D0,A0
  260.  MOVE.B    D7,(A0)+
  261.  ADDQ.W    #1,D0          i+
  262.  MOVE.W    D0,VARi(A4)
  263.  CMPI.B    #$A,D7         c=10?
  264.  BNE       CKIO
  265.  CLR.B     (A0)           (i)=0
  266.  TST.B     MON(A4)
  267.  BEQ       MONMODE
  268.  SUBQ.W    #1,D0
  269.  BEQ       ENDI           i=0 and c=LF ?
  270.  
  271. ***
  272. *ISCALL ; Does rbuff contain a call string
  273. ***
  274.  CLR.B     newcall(A4)
  275.  MOVEQ     #0,D0
  276.  LEA       rbuff(A4),A0
  277. ISCALL1
  278.  ADDQ.L    #1,D0
  279.  MOVE.B    (A0)+,D7
  280.  BEQ.S     MONMODE  c=0
  281.  CMPI.B    #'-',D7  c=invalid
  282.  BLT.S     MONMODE
  283.  CMPI.B    #4,D0    i<5
  284.  BLT.S     ISCALL1
  285.  CMPI.B    #9,D0    i>9
  286.  BGT.S     MONMODE
  287.  CMPI.B    #'>',D7  c=>
  288.  BNE.S     ISCALL1
  289.  
  290. ***
  291. * NEWCALL- not same call
  292. ***
  293.  LEA       rbuff(A4),A0
  294.  LEA       cbuff(A4),A1
  295. NEWCALL1
  296.  CMPM.B    (A0)+,(A1)+
  297.  BNE.S     NEWCALL2
  298.  TST.B     -1(A0)
  299.  BNE.S     NEWCALL1
  300.  BRA.S     ENDI
  301.  
  302. NEWCALL2
  303.  CMPI.B    #'*',-1(A0)
  304.  BEQ.S     ENDI
  305.  CMPI.B    #'*',-1(A1)
  306.  BEQ.S     ENDI
  307. * MOVE.B    #1,newcall(A4)
  308.  ST        newcall(A4)
  309.  
  310. ***
  311. * CALL - update call buffer
  312. ***
  313.  
  314.  LEA       rbuff(A4),A0
  315.  LEA       cbuff(A4),A1
  316. CALL
  317.  MOVE.B    (A0)+,(A1)+
  318.  BNE.S     CALL
  319.  
  320. ***
  321. MONMODE ; to screen & capture
  322. ***
  323.  TST.B     MON(A4)
  324.  BEQ.S     CAPMODE
  325.  TST.B     newcall(A4)
  326.  BEQ.S     MONMODE1
  327.  MOVEQ     #$A,D7   
  328.  BSR       EMITD7
  329.  BSR       DOCAP
  330. MONMODE1
  331.  LEA       rbuff(A4),A0
  332.  BSR       EMITS
  333. CAPMODE
  334.  TST.B     CAPTURE(A4)
  335.  BEQ.S     ENDI
  336.  PEA       rbuff(A4)
  337. CAPMODE1
  338.  MOVEA.L   (A7),A0
  339.  MOVE.B    (A0)+,D7
  340.  BEQ.S     ENDB
  341.  MOVE.L    A0,(A7)
  342.  BSR       DOCAP
  343.  BRA.S     CAPMODE1
  344.  
  345. ENDB
  346.  MOVE.L   (A7)+,A0
  347. ENDI
  348.  CLR.W    VARi(A4)
  349.  BRA      CKIO
  350.  
  351. ***
  352. CKKEY ;Check for keyboard or mouse or send
  353. ***
  354.  
  355.  MOVE.B    send(A4),D0
  356.  AND.B     sendok(A4),D0
  357.  BEQ.S     NXT_MSG
  358.  BSR       GET_SEND_CHAR  Get char from READ file & send serial
  359.  
  360. * while(NewMessage=(struct IntuiMessage *)GetMsg(mywindow->UserPort))
  361. NXT_MSG
  362.  BSR       GET_MSG
  363.  BEQ       MAIN
  364.  
  365. * switch(NewMessage->Class)
  366.  MOVEA.L   N_M(A4),A0
  367.  MOVE.L    $14(A0),D0
  368.  CMPI.W    #$200,D0
  369.  BEQ       ENDALL
  370.  CMPI.W    #$400,D0
  371.  BNE.S     NXT_MSG
  372.  
  373. * User hit key *
  374.  MOVEQ     #0,D0
  375.  MOVE.B    D7,D0
  376.  CMPI.B    #$59,D7
  377.  BEQ       ENDALL L826
  378.  CMPI.B    #$55,D7
  379.  BEQ       DO_NEWCLI
  380.  CMPI.B    #$5F,D7
  381.  BEQ       HELP_KEY
  382.  CMPI.B    #$54,D7
  383.  BEQ       F5_KEY
  384.  CMPI.B    #$52,D7
  385.  BEQ       F3_KEY
  386.  CMPI.B    #$51,D7
  387.  BEQ       F2_KEY
  388.  CMPI.B    #$50,D7
  389.  BNE       SEND_SERIAL
  390.  
  391. * case 80:  /* F1 KEY */
  392.  TST.B     CAPTURE(A4)
  393.  BEQ.S     OPENCAP
  394.  BSR       CLOSECAP
  395.  BRA       NXT_MSG
  396.  
  397. ***
  398. OPENCAP ;Open Capture buffer
  399. ***
  400.  LEA       MCAPTURE(PC),A0
  401.  BSR       EMITS
  402.  PEA       name(A4)
  403.  BSR       FILENAME
  404.  ADDQ.L    #4,A7
  405.  
  406.  MOVE.L    #1006,D2
  407.  LEA       name(A4),A0
  408.  MOVE.L    A0,D1
  409.  JSR       _LVOOpen(A5)
  410.  MOVE.L    D0,FHCAPT(A4)
  411.  BEQ       DOMERROR
  412.  ST        CAPTURE(A4)
  413.  BRA       NXT_MSG
  414.  
  415.  
  416. ***
  417. F2_KEY ;Open/close read file to send serial
  418. ***
  419.  TST.B     send(A4)
  420.  BEQ.S     NEW_READ
  421.  BSR       CLOSESEND
  422.  LEA       SENDCAN(PC),A0
  423.  BSR       EMITS
  424.  BRA       NXT_MSG
  425.  
  426. NEW_READ
  427.  LEA       MSEND(PC),A0
  428.  BSR       EMITS
  429.  PEA       xname(A4)
  430.  BSR       FILENAME
  431.  ADDQ.L    #4,A7
  432.  
  433. *** OPEN READ FILE TO SEND CHARS OVER SERIAL
  434.  MOVE.L    #1005,D2
  435.  LEA       xname(A4),A0
  436.  MOVE.L    A0,D1
  437.  JSR       _LVOOpen(A5)
  438.  MOVE.L    D0,FHSEND(A4)
  439.  BEQ       DOMERROR
  440.  CLR.W     SENCNT(A4)
  441.  ST        send(A4)
  442.  BRA       NXT_MSG
  443.  
  444.  
  445. ***
  446. F3_KEY ;Next lower Baud rate
  447. ***
  448. * AbortIO(Read_Request)
  449.  MOVE.L    R_R(A4),A1
  450.  JSR       _LVOAbortIO(A6)
  451.  
  452.  MOVEQ     #0,D0
  453.  MOVE.B    brate(A4),D0
  454.  SUBQ      #1,D0
  455.  BGE       L710
  456.  MOVEQ     #2,D0
  457. L710
  458.  MOVE.B    D0,brate(A4)
  459.  
  460. * Read_Request->io_Baud=(bratev[brate])
  461.  ASL.W     #1,D0
  462.  LEA       bratev(PC),A0
  463.  MOVE.W    0(A0,D0.W),D0
  464.  BSR       DO_RR_BEGIN
  465.  BRA.S     HELP_KEY
  466.  
  467. ***
  468. F5_KEY ;Toggle MON mode
  469. ***
  470.  EOR.B     #1,MON(A4)
  471.  
  472. ***
  473. HELP_KEY
  474. ***
  475.  LEA       MONON(PC),A0
  476.  TST.B     MON(A4)
  477.  BNE.S     HELP1
  478.  LEA       MONOFF(PC),A0
  479. HELP1
  480.  BSR       EMITS
  481.  LEA       name(A4),A0
  482.  BSR       EMITS
  483.  
  484.  LEA       MOPEN(PC),A0
  485.  TST.B     CAPTURE(A4)
  486.  BNE.S     HELP2
  487.  LEA       MCLOSED(PC),A0
  488. HELP2
  489.  BSR       EMITS
  490.  
  491. * emits(brates[brate])
  492.  MOVEQ     #0,D0
  493.  MOVE.B    brate(A4),D0
  494.  ASL.L     #2,D0
  495.  ADD.B     brate(A4),D0
  496.  MOVEA.L   D0,A0
  497.  ADDA.L    #brates,A0
  498.  BSR       EMITS
  499.  
  500.  LEA       MHELP(PC),A0
  501.  BSR       EMITS
  502.  BRA       NXT_MSG
  503.  
  504. ***
  505. DO_NEWCLI
  506. ***
  507.  LEA       NEWCLI(PC),A0
  508.  MOVE.L    A0,D1
  509.  CLR.L     D2
  510.  CLR.L     D3
  511.  JSR       _LVOExecute(A5)
  512.  BNE       NXT_MSG
  513.  
  514.  
  515. ***
  516. DOMERROR ;Print *** ERROR
  517. ***
  518.  BSR       DOMERR1
  519.  BRA       NXT_MSG
  520.  
  521. ***
  522. SEND_SERIAL ;D7 to serial
  523. ***
  524.  BSR       TOASC
  525.  BEQ       NXT_MSG
  526.  BSR       WRITE1
  527.  BRA       NXT_MSG
  528.  
  529.  
  530. ***
  531. ENDALL ;Clean up and exit program
  532. ***
  533.  BSR       CLOSECAP
  534.  BSR       CLOSESEND
  535.  MOVE.L    R_R(A4),A1
  536.  JSR       _LVOCloseDevice(A6)
  537.  
  538. *DeletePort(Read_Request->IOSer.io_Message.mn_ReplyPort)
  539.  MOVEA.L   R_R(A4),A0
  540.  BSR       DELETEPORT
  541.  
  542. *FreeMem(Read_Request,sizeof(*Read_Request))
  543.  MOVEQ     #$52,D0
  544.  MOVE.L    R_R(A4),A1
  545.  JSR       _LVOFreeMem(A6)
  546.  
  547. *CloseDevice(Write_Request)
  548.  MOVE.L    W_R(A4),A1
  549.  JSR       _LVOCloseDevice(A6)
  550.  
  551. *DeletePort(Write_Request->IOSer.io_Message.mn_ReplyPort)
  552.  MOVEA.L   W_R(A4),A0
  553.  BSR       DELETEPORT
  554.  
  555. *FreeMem(Write_Request,sizeof(*Write_Request))
  556.  MOVEQ     #$52,D0
  557.  MOVE.L    W_R(A4),A1
  558.  JSR       _LVOFreeMem(A6)
  559.  
  560. *CloseWindow(mywindow);
  561.  MOVE.L    A6,-(A7)
  562.  MOVEA.L   _IntuitionBase(PC),A6
  563.  MOVE.L    mywindow(PC),A0
  564.  JSR       _LVOCloseWindow(A6)
  565.  MOVEA.L   (A7)+,A6
  566.  
  567.  MOVEQ     #0,D1     exit(0)
  568. EXITX
  569.  JSR       _LVOExit(A5)   gone
  570.  
  571. EXIT1
  572.  MOVEQ     #1,D1
  573.  BRA.S     EXITX
  574.  
  575.  
  576. ***
  577. EMITD7 ;Emit char in D7
  578. ***
  579.  MOVE.L    D7,-(A7)
  580.  BSR       EMITC
  581.  ADDQ.L    #4,A7
  582.  RTS
  583.  
  584.  
  585. ***
  586. TOASC ;Convert keycode in D7 to ascii
  587. ***
  588.  MOVEQ     #0,D0
  589.  LEA       KEYS(PC),A1
  590.  
  591.  CMPI.B    #75,D7 if (code<75)
  592.  BCC.S     NO_CONVERT
  593.  ADD.B     SHIFT-KEYS(A1),D7 if (shift) code+=75
  594.  MOVEA.L   A1,A0
  595.  ADDA.L    D7,A0  c=keys[code]
  596.  MOVE.B    (A0),D0
  597.  
  598.  CMPI.B    #'a',D0 if (c>='a' && c<='z')
  599.  BCS.S     TOASCRET
  600.  CMPI.B    #'z',D0
  601.  BHI.S     TOASCRET
  602.  
  603.  TST.B     CTRL-KEYS(A1) if (ctrl)
  604.  BEQ.S     TOASC1
  605.  SUB.B     CTRL-KEYS(A1),D0   c-=96
  606.  BRA.S     TOASCRET
  607.  
  608. TOASC1
  609.  SUB.B     CAPSL-KEYS(A1),D0  c-=32
  610.  BRA.S     TOASCRET
  611.  
  612.  
  613. NO_CONVERT
  614.  CMPI.B    #96,D7 if (code>=96 && code<=97) shift=1
  615.  BCS.S     TOASC3
  616.  CMPI.B    #97,D7
  617.  BHI.S     TOASC3
  618.  MOVE.B    #75,SHIFT-KEYS(A1)
  619.  
  620. TOASC3
  621.  CMPI.B    #98,D7 if (code=98) capsl=1
  622.  BNE.S     TOASC4
  623.  MOVE.B    #32,CAPSL-KEYS(A1)
  624.  
  625. TOASC4
  626.  CMPI.B    #99,D7 if (code=99) ctrl=1
  627.  BNE.S     TOASC5
  628.  MOVE.B    #96,CTRL-KEYS(A1)
  629.  
  630. TOASC5
  631.  CMPI.B    #224,D7 if (code>=224 && code<=225)
  632.  BCS.S     TOASC6
  633.  CMPI.B    #225,D7
  634.  BHI.S     TOASC6
  635.  CLR.B     SHIFT-KEYS(A1)
  636.  
  637. TOASC6
  638.  CMPI.B    #226,D7 if (code=226) capsl=0
  639.  BNE.S     TOASC7
  640.  CLR.B     CAPSL-KEYS(A1)
  641.  
  642. TOASC7
  643.  CMPI.B    #227,D7 if (code=227) ctrl=0
  644.  BNE.S     TOASCRET
  645.  CLR.B     CTRL-KEYS(A1)
  646.  
  647. TOASCRET
  648.  MOVE.L    D0,D7
  649.  RTS
  650.  
  651.  
  652. ***
  653. EMITS ;Emit String of text to screen
  654. ***
  655.  MOVE.B    (A0)+,D0
  656.  BEQ.S     LRETURN
  657.  
  658.  MOVE.L    A0,-(A7)
  659.  MOVE.L    D0,-(A7) emit(c);
  660.  BSR       EMITC
  661.  ADDQ.L    #4,A7
  662.  MOVE.L    (A7)+,A0
  663.  
  664.  BRA.S     EMITS
  665.  
  666. LRETURN
  667.  RTS
  668.  
  669.  
  670. ***
  671. FILENAME ; get name
  672. ***
  673.  CLR.L     -(A7) i=0
  674.  
  675. FILENAME1
  676. *  if (NewMessage=(struct IntuiMessage *)GetMsg(mywindow->UserPort))
  677.  BSR       GET_MSG
  678.  BEQ       FILENAME1
  679.  
  680. *     c=toasc(NewMessage->Code)
  681. * MOVE.L    (A7)+,A0 NewMessage
  682. * MOVE.W    $18(A0),D7  W/B ??
  683.  BSR       TOASC
  684.  CMPI.B    #13,D7 if (c==13)
  685.  BNE.S     FILENAME2
  686.  MOVE.L    D7,-(A7) emit(c)
  687.  BSR       EMITC
  688.  ADDQ.L    #4,A7
  689.  MOVEA.L   8(A7),A0 name[i]=0
  690.  ADDA.L    (A7),A0  i
  691.  CLR.B     (A0)
  692.  BRA.S     FRETURN
  693.  
  694. FILENAME2
  695.  CMPI.B    #32,D7 if (c>=32)
  696.  BCS.S     FILENAME3
  697.  MOVEA.L   8(A7),A0 name[i]=c
  698.  ADDA.L    (A7),A0  i
  699.  MOVE.B    D7,(A0)  put in name
  700.  MOVE.L    D7,-(A7)
  701.  BSR       EMITC
  702.  ADDQ.L    #4,A7
  703.  ADDQ.L    #1,(A7)  i+=1
  704.  BRA.S     FILENAME1
  705.  
  706. FILENAME3
  707.  CMPI.B    #8,D7 if (c==8 && i)
  708.  BNE.S     FILENAME1
  709.  TST.L     (A7)
  710.  BEQ.S     FILENAME1
  711.  LEA       BSPACE(PC),A0  emits(8,32,8,0)
  712.  BSR       EMITS
  713.  SUBQ.L    #1,(A7) i-=1
  714.  BRA       FILENAME1
  715.  
  716. FRETURN ADDQ.L  #4,A7
  717.  RTS
  718.  
  719.  
  720. ***
  721. EMITC ;Emit character to screen
  722. ***
  723.  LINK      A4,#-4
  724.  MOVEM.L   A3/A6/D2/D5-D7,-(A7)
  725.  MOVE.B    11(A4),D7
  726.  BEQ       EMITRTS
  727.  
  728.  MOVE.W    CX,D6 x=cx
  729.  MOVE.W    CY,D5 y=cy
  730.  MOVEA.L   mywindow(PC),A3
  731.  MOVE.L    $32(A3),A3
  732.  
  733. * Remove cursor
  734.  MOVEQ     #2,D0 COMPLEMENT
  735.  BSR       DRMDSET
  736.  BSR       CURNORM
  737.  
  738.  MOVEQ     #1,D0 JAM2
  739.  BSR       DRMDSET
  740.  
  741. * switch(c)
  742.  MOVE.B    D7,D0
  743.  SUBI.B    #7,D0
  744.  BLT.S     CASEDEF
  745.  CMPI.B    #7,D0
  746.  BGE.S     CASEDEF
  747.  ASL.L     #1,D0
  748.  JMP       JMPTAB(PC,D0)
  749.  
  750. JMPTAB
  751.  BRA.S     CASE7  7
  752.  BRA.S     CASE8  8
  753.  BRA.S     CASE9  9
  754.  BRA.S     CASE10 10
  755.  BRA.S     CASEDEF 11
  756.  BRA.S     CASE12 12
  757.  BRA.S     CASE10 13
  758.  
  759. * ClipBlit(mywindow->RPort,0,0,mywindow->RPort,0,y-6,WD,HT,0x50)
  760. CASE7
  761.  MOVEM.L   D5/A6,-(A7)
  762.  MOVE.L    D5,D3   y
  763.  SUBQ.L    #6,D3   y-6
  764.  MOVEQ.L   #$50,D6 $50
  765.  MOVE.L    #HT,D5   HT
  766.  MOVE.L    #WD,D4   WD
  767.  CLR.L     D2       0
  768.  MOVE.L    A3,A1
  769.  CLR.L     D1       0
  770.  CLR.L     D0       0
  771.  MOVE.L    A3,A0
  772.  MOVEA.L   _GfxBase(PC),A6
  773.  JSR       _LVOClipBlit(A6)
  774.  MOVEM.L   (A7)+,D5/A6
  775.  BRA.S     LB18
  776.  
  777. CASE8
  778.  SUBQ.W    #8,D6 x-=8;
  779.  CMPI.W    #1,D6 if (x<1)
  780.  BGE.S     LB18
  781.  MOVEQ     #0,D6 x=0
  782.  BRA.S     LB18
  783.  
  784. CASE9
  785.  ADDI.W    #40,D6 x+=40
  786.  BRA.S     LB18
  787.  
  788. CASE12
  789.  MOVEQ     #0,D6 x=0
  790.  MOVEQ     #6,D5 y=6
  791.  BRA.S     LB18
  792.  
  793. CASE10
  794.  MOVEQ     #0,D6 x=0
  795.  ADDQ.W    #8,D5 y+=8
  796.  BRA.S     LB18
  797.  
  798. CASEDEF
  799.  MOVEQ     #1,D0     Text(mywindow->RPort,&cc,1)
  800.  LEA.L     11(A4),A0    Point to byte c
  801.  MOVE.L    A3,A1
  802.  MOVE.L    A6,-(A7)
  803.  MOVE.L    _GfxBase(PC),a6
  804.  JSR       _LVOText(A6)
  805.  MOVEA.L   (A7)+,A6
  806.  ADDQ.W    #8,D6     x+=8
  807.  
  808. * cursor *
  809. LB18
  810.  CMPI.W    #WD,D6 if (x>(WD-_3))
  811.  BLE.S     LB22
  812.  MOVEQ     #0,D6 {x=0;
  813.  ADDQ.W    #8,D5 y=y+8;}
  814.  
  815. LB22
  816.  CMPI.W    #HT-2,D5 if (y>(HT-2))
  817.  BLE.S     LB58
  818.  MOVEQ     #0,D6 {x=0;
  819.  SUBQ.W    #8,D5 y-=8;
  820.  MOVEM.L   D5/A6,-(A7)
  821.  MOVE.L    #HT,D5  ScrollRaster(mywindow->RPort,0,8,0,0,WD,HT);}
  822.  MOVE.L    #WD,D4
  823.  CLR.L     D3
  824.  CLR.L     D2
  825.  MOVEQ     #8,D1
  826.  CLR.L     D0
  827.  MOVE.L    A3,A1
  828.  MOVE.L    _GfxBase(PC),A6
  829.  JSR       _LVOScrollRaster(A6)
  830.  MOVEM.L   (A7)+,D5/A6
  831.  
  832. LB58 ;Move(mywindow->RPort,x,y);
  833.  MOVE.L    D5,D1
  834.  MOVE.L    D6,D0
  835.  MOVE.L    A3,A1
  836.  MOVE.L    A6,-(A7)
  837.  MOVEA.L   _GfxBase(PC),A6
  838.  JSR       _LVOMove(A6)
  839.  MOVEA.L   (A7)+,A6
  840.  
  841. * Put cursor
  842.  BSR       CURNORM
  843.  
  844.  MOVE.W    D6,CX cx=x
  845.  MOVE.W    D5,CY cy=y
  846.  
  847. EMITRTS
  848.  MOVEM.L   (A7)+,A3/A6/D2/D5-D7
  849.  UNLK      A4
  850.  RTS
  851.  
  852.  
  853. * SetDrMd(mywindow->RPort,??);
  854. ***
  855. DRMDSET ;Set Drawing Mode
  856. ***
  857.  MOVE.L    A6,-(A7)
  858.  MOVE.L    A3,A1
  859.  MOVEA.L   _GfxBase(PC),A6
  860.  JSR       _LVOSetDrMd(A6)
  861.  MOVEA.L   (A7)+,A6
  862.  RTS
  863.  
  864. CURNORM
  865.  MOVEQ     #3,D0
  866.  BSR       PENSET
  867.  BSR       FILLRECT
  868. PENSET1
  869.  MOVEQ     #1,D0
  870.  
  871. * SetAPen(mywindow->RPort,??)
  872. ***
  873. PENSET ;Set Pen type
  874. ***
  875.  MOVE.L    A6,-(A7)
  876.  MOVE.L    A3,A1
  877.  MOVEA.L   _GfxBase(PC),A6
  878.  JSR       _LVOSetAPen(A6)
  879.  MOVEA.L   (A7)+,A6
  880.  RTS
  881.  
  882.  
  883. * RectFill(mywindow->RPort,x,y-6,x+6,y+1)
  884. ***
  885. FILLRECT ;Fill Rectangle
  886. ***
  887.  MOVE.L    D6,D2     x
  888.  MOVE.L    D5,D1     y
  889.  SUBQ.L    #6,D1     y-6
  890.  ADDQ.L    #6,D2     x+6
  891.  MOVE.L    D5,D3
  892.  ADDQ.L    #1,D3     y+1
  893.  MOVE.L    D6,D0     x
  894.  MOVE.L    A3,A1
  895.  MOVE.L    A6,-(A7)
  896.  MOVEA.L   _GfxBase(PC),A6
  897.  JSR       _LVORectFill(A6)
  898.  MOVEA.L   (A7)+,A6
  899.  RTS
  900.  
  901.  
  902. ***
  903. DO_RR_BEGIN
  904. ***
  905.  MOVE.L    R_R(A4),A1
  906.  MOVE.L    D0,$3C(A1)   io_Baud=1200
  907.  MOVE.W    #$B,$1C(A1)  IOSer.io_Command=SDCMD_SETPARAMS
  908.  JSR       _LVODoIO(A6)
  909.  MOVEA.L   R_R(A4),A0
  910.  MOVE.W    #2,$1C(A0)   IOSER.io_Command=CMD_READ
  911.  
  912. ***
  913. BeginIO_RR ;BeginIO(Read_Request)
  914. ***
  915.  MOVE.L    R_R(A4),A1
  916.  MOVE.L    A6,-(A7)
  917.  MOVEA.L   $14(A1),A6
  918.  JSR       -$1E(A6) ?? FFE2
  919.  MOVEA.L   (A7)+,A6
  920.  RTS
  921.  
  922. ***
  923. OPEN_SERIAL
  924. ***
  925.  CLR.L     D1
  926. * A1=ReadRequest
  927.  CLR.L     D0
  928.  LEA       SERIALNAME(PC),A0
  929.  JSR       _LVOOpenDevice(A6)
  930.  TST.L     D0
  931.  RTS
  932.  
  933.  
  934. ***
  935. DO_Alloc ;Allocate mem for msg ports
  936. ***
  937.  MOVE.L    #$10001,D1
  938.  MOVEQ     #$52,D0
  939.  JMP       _LVOAllocMem(A6)
  940.  
  941.  
  942. ***
  943. GET_MSG ;Get system msg and ack it
  944. ***
  945.  MOVEA.L   mywindow(PC),A0
  946.  MOVE.L    $56(A0),A0
  947.  JSR       _LVOGetMsg(A6)
  948.  MOVE.L    D0,N_M(A4)
  949.  BEQ.S     GMRTS
  950.  MOVE.L    D0,A0
  951.  MOVE.W    $18(A0),D7    NewMessage->Code
  952.  
  953. * ReplyMsg(NewMessage);
  954.  MOVE.L    A0,A1
  955.  JSR       _LVOReplyMsg(A6)
  956.  TST.B     D7
  957. GMRTS RTS
  958.  
  959.  
  960. ***
  961. DOCAP ; put captured byte in file
  962. ***
  963.  TST.B     CAPTURE(A4)
  964.  BEQ.S     DOCAPRET
  965.  LEA       BUFCAP(A4),A0
  966.  MOVE.W    CAPCNT(PC),D0
  967.  MOVE.B    D7,0(A0,D0.W)
  968.  ADDQ.W    #1,D0
  969.  MOVE.W    D0,CAPCNT
  970.  CMPI.W    #CAPSIZE,D0
  971.  BNE.S     DOCAPRET
  972.  
  973. ***
  974. CAP_FLUSH ;write buffer to disk
  975. ***
  976.  TST.B     CAPTURE(A4)
  977.  BEQ.S     DOCAPRET
  978.  MOVE.L    FHCAPT(A4),D1
  979.  LEA       BUFCAP(A4),A0
  980.  MOVE.L    A0,D2
  981.  CLR.L     D3
  982.  MOVE.W    CAPCNT(PC),D3
  983.  JSR       _LVOWrite(A5)
  984.  CLR.W     CAPCNT
  985.  TST.L     D0
  986.  BMI       DOMERR1
  987. DOCAPRET   RTS
  988.  
  989. ***
  990. CLOSECAP ;Close capture file
  991. ***
  992.  TST.B     CAPTURE(A4)
  993.  BEQ.S     DOCAPRET
  994.  BSR       CAP_FLUSH
  995.  SF        CAPTURE(A4)
  996.  MOVE.L    FHCAPT(A4),D1
  997.  JSR       _LVOClose(A5)
  998.  LEA       CCLOSED(PC),A0
  999.  BRA       EMITS
  1000.  
  1001. ***
  1002. SEND_BUF_FILL ;Fill transmit buffer
  1003. ***
  1004.  MOVE.L    FHSEND(A4),D1
  1005.  LEA       BUFSEN(A4),A0
  1006.  MOVE.L    A0,SENPNT(A4)
  1007.  MOVE.L    A0,D2
  1008.  MOVEQ.L   #0,D3
  1009.  MOVE.W    #512,D3
  1010.  JSR       _LVORead(A5)
  1011.  MOVE.W    D0,SENCNT(A4)
  1012.  BEQ.S     CLOSESEND
  1013.  BMI.S     CLOSESEND1
  1014.  
  1015. ***
  1016. GET_SEND_CHAR ;get char from read file
  1017. ***
  1018.  SUBQ.W    #1,SENCNT(A4)
  1019.  BMI.S     SEND_BUF_FILL
  1020.  MOVE.L    SENPNT(A4),A0
  1021.  MOVE.B    (A0)+,D7
  1022.  MOVE.L    A0,SENPNT(A4)
  1023.  CMPI.B    #$A,D7
  1024.  BNE.S     WRITE1
  1025.  MOVEQ     #$D,D7
  1026.  
  1027. ***
  1028. WRITE1 ;Serial output
  1029. ***
  1030.  MOVE.B    D7,rs_out(A4)
  1031.  MOVE.L    W_R(A4),A1
  1032.  JMP       _LVODoIO(A6)
  1033.  
  1034. CLOSESEND1
  1035.  BSR       DOMERR1
  1036. ***
  1037. CLOSESEND ;Close read file
  1038. ***
  1039.  TST.B     send(A4)
  1040.  BEQ.S     SENDRTS
  1041.  MOVE.L    FHSEND(A4),D1
  1042.  JSR       _LVOClose(A5)
  1043.  CLR.B     send(A4)
  1044.  LEA       FILESENT(PC),A0
  1045.  BRA       EMITS
  1046. SENDRTS RTS
  1047.  
  1048.  
  1049. ***
  1050. DOMERR1 ;Print *** ERROR
  1051. ***
  1052.  LEA       MERROR(PC),A0
  1053.  BRA       EMITS
  1054.  
  1055. ***
  1056. DELETEPORT ;Free mem used by msg port
  1057. ***
  1058.  MOVE.L    $E(A0),A2
  1059.  TST.L     $A(A2)
  1060.  BEQ.S     L446D0
  1061.  MOVE.L    A2,A1
  1062.  JSR       _LVORemPort(A6)
  1063.  
  1064. L446D0
  1065.  MOVE.B    #-1,8(A2)
  1066.  MOVEQ     #-1,D2
  1067.  MOVE.L    D2,$14(A2)
  1068.  MOVEQ     #0,D0
  1069.  MOVE.B    $F(A2),D0
  1070.  JSR       -$150(A6)   FEB0
  1071.  MOVEQ.L   #$22,D0
  1072.  MOVE.L    A2,A1
  1073.  JMP       _LVOFreeMem(A6)
  1074.  
  1075.  
  1076. ***
  1077. DoCreate ;Create a msg port
  1078. ***
  1079.  MOVE.L  A0,D4
  1080.  MOVEM.L A2/D5,-(A7)
  1081.  MOVEQ.L #-1,D0
  1082.  JSR     _LVOAllocSignal(A6)
  1083.  MOVEQ.L #0,D5
  1084.  MOVE.B  D0,D5
  1085.  BMI.S   SUB0
  1086.  MOVE.L  #$10001,D1
  1087.  MOVEQ.L #$22,D0
  1088.  JSR     _LVOAllocMem(A6)
  1089.  MOVEA.L D0,A2
  1090.  TST.L   D0      ??
  1091.  BNE.S   L44670
  1092.  MOVE.B  D5,D0
  1093.  JSR     _LVOFreeSignal(A6)
  1094. SUB0
  1095.  MOVEQ   #0,D0
  1096.  BRA.S   L446B2
  1097.  
  1098. L44670
  1099.  MOVE.L  D4,$A(A2)
  1100.  CLR.B   9(A2)
  1101.  MOVE.B  #4,8(A2)
  1102.  CLR.B   $E(A2)
  1103.  MOVE.B  D5,$F(A2)
  1104.  MOVEQ.L #0,D0
  1105.  MOVE.L  D0,A1
  1106.  JSR     _LVOFindTask(A6)
  1107.  MOVE.L  D0,$10(A2)
  1108.  TST.L   D4
  1109.  BEQ.S   L446A4
  1110.  MOVE.L  A2,A1
  1111.  JSR     _LVOAddPort(A6)
  1112.  BRA.S   L446B0
  1113.  
  1114. L446A4
  1115.  LEA.L   $14(A2),A0
  1116.  MOVE.L  A0,(A0)
  1117.  ADDQ.L  #4,(A0)
  1118.  CLR.L   4(A0)
  1119.  MOVE.L  A0,8(A0)
  1120.  
  1121. L446B0
  1122.  MOVE.L  A2,D0
  1123. L446B2
  1124.  MOVEM.L (A7)+,D5/A2
  1125.  RTS
  1126.  
  1127. * SECTION data
  1128. bratev DC.W 300,1200,9600
  1129.  
  1130. CAPCNT DC.W 0
  1131. CX DC.W 0
  1132. CY DC.W 14
  1133.  
  1134. *struct NewWindow NewWindow =
  1135. *{0,0,WD,HT,0,1,
  1136. * CLOSEWINDOW|RAWKEY|NEWSIZE,
  1137. * WINDOWCLOSE|SMART_REFRESH|ACTIVATE|WINDOWDEPTH|REPORTMOUSE|BORDERLESS,
  1138. * NULL, NULL, (title), NULL, NULL,
  1139. * 100,35,WD,HT, WBENCHSCREEN,};
  1140.  
  1141. NewWindow
  1142.  DC.W 0,0,WD,HT,1
  1143.  DC.L $602,$1A0C,0,0
  1144.  DC.L MTITLE,0,0
  1145.  DC.W 100,35,WD,HT,1
  1146.  
  1147. INTU_LIB DC.B 'intuition.library',0
  1148. GRAP_LIB DC.B 'graphics.library',0
  1149. MRead_RS DC.B 'Read_RS',0
  1150. MWrite_RS DC.B 'Write_RS',0
  1151. NEWCLI DC.B 'NEWCLI',0
  1152. MHELP DC.B ' BAUD',10,'F1=CAPTURE F2=SEND F3=BAUD F4=MON F6=CLI F10=QUIT',10,0
  1153. SENDCAN DC.B 10,'Send Cancelled',10,0
  1154. MSEND DC.B 10,'Send:',0
  1155. MERROR DC.B '*** Error',10,0
  1156. MOPEN DC.B '=OPEN    ',0
  1157. MCLOSED DC.B '=CLOSED  ',0
  1158. MCAPTURE DC.B 10,'Capture:',0
  1159. CCLOSED DC.B 10,'*** Closed',10,0
  1160. MONON DC.B 10,'MON=ON   ',0
  1161. MONOFF DC.B 10,'MON=OFF   ',0
  1162. FILESENT DC.B 10,'File Sent',10,0
  1163. SERIALNAME DC.B 'serial.device',0
  1164. brates DC.B ' 300',0,'1200',0,'9600',0
  1165. CTRL DC.B 0
  1166. SHIFT DC.B 0
  1167. CAPSL DC.B 32
  1168.  
  1169.  CNOP 0,2
  1170. *static char keys[75+75] = {
  1171. KEYS
  1172.  DC.B '`1234567890-=\',0
  1173.  DC.B '0qwertyuiop[]',0,'123'
  1174.  DC.B 'asdfghjkl;''',0,0,'456'
  1175.  DC.B  0,'zxcvbnm',44,'./',0,'.789 '
  1176.  DC.B  8,10,13,13,27,127,0,0,0,'-'
  1177.  
  1178.  DC.B '~!@#$%^&*()_+|',0
  1179.  DC.B '0QWERTYUIOP{}',0,'123'
  1180.  DC.B 'ASDFGHJKL:"',0,0,'456'
  1181.  DC.B  0,'ZXCVBNM<>?',0,'.789 '
  1182.  DC.B  8,10,13,13,27,127,0,0,0,'-'
  1183.  CNOP 0,2
  1184.  
  1185. BSPACE DC.B 8,32,8,0
  1186. DOSName   DC.B  'dos.library',0
  1187.  
  1188. MTITLE DC.B '** P81 081686 ***',0
  1189.  CNOP 0,2
  1190. mywindow       DS.L 1
  1191. _GfxBase       DS.L 1
  1192. _IntuitionBase DS.L 1
  1193.  END
  1194.  
  1195.